home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / mtools.lha / mtools-2.0.7 / mlabel.c < prev    next >
C/C++ Source or Header  |  1992-09-10  |  3KB  |  130 lines

  1. /*
  2.  * Make an MSDOS volume label
  3.  *
  4.  * Emmet P. Gray            US Army, HQ III Corps & Fort Hood
  5.  * ...!uunet!uiucuxc!fthood!egray    Attn: AFZF-DE-ENV
  6.  * fthood!egray@uxc.cso.uiuc.edu    Directorate of Engineering & Housing
  7.  *                     Environmental Management Office
  8.  *                     Fort Hood, TX 76544-5057
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <ctype.h>
  13. #include "msdos.h"
  14. #include "patchlevel.h"
  15.  
  16. int fd = -1;                /* the file descriptor for the device */
  17. int dir_start;                /* starting sector for directory */
  18. int dir_len;                /* length of directory (in sectors) */
  19. int dir_entries;            /* number of directory entries */
  20. int clus_size;                /* cluster size (in sectors) */
  21. char *mcwd;                /* the Current Working Directory */
  22. int fat_error;                /* FAT error detected? */
  23.  
  24. main(argc, argv)
  25. int argc;
  26. char *argv[];
  27. {
  28.     int entry, slot, fargn, verbose, oops;
  29.     char filename[30], *strncpy(), drive, ans[10], *strncat();
  30.     char *strcpy(), *fix_mcwd();
  31.     unsigned char fixed[12], vol[12];
  32.     void exit(), dir_write(), dir_flush(), disk_flush();
  33.     struct directory *dir, *dir_read(), *mk_entry();
  34.     long time(), now;
  35.  
  36.     fargn = 1;
  37.     verbose = 0;
  38.     oops = 0;
  39.     if (argc > 1) {
  40.         if (!strcmp(argv[1], "-v")) {
  41.             fargn = 2;
  42.             verbose = 1;
  43.         }
  44.         if (argv[1][0] == '-' && !verbose)
  45.             oops++;
  46.     }
  47.     if (argc < 2 || argv[fargn][1] != ':' || oops) {
  48.         fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE);
  49.         fprintf(stderr, "Usage: %s [-v] drive:\n", argv[0]);
  50.         exit(1);
  51.     }
  52.     mcwd = fix_mcwd();
  53.  
  54.     drive = argv[fargn][0];
  55.     if (islower(drive))
  56.         drive = toupper(drive);
  57.  
  58.     if (init(drive, 2)) {
  59.         fprintf(stderr, "%s: Cannot initialize '%c:'\n", argv[0], drive);
  60.         exit(1);
  61.     }
  62.                     /* see if a label exists and get slot */
  63.     slot = -1;
  64.     vol[0] = '\0';
  65.     for (entry = 0; entry < dir_entries; entry++) {
  66.         dir = dir_read(entry);
  67.                     /* if empty */
  68.         if (dir->name[0] == 0x0) {
  69.             if (slot < 0)
  70.                 slot = entry;
  71.             break;
  72.         }
  73.                     /* if erased */
  74.         if (dir->name[0] == 0xe5) {
  75.             if (slot < 0)
  76.                 slot = entry;
  77.             continue;
  78.         }
  79.                     /* if not a volume label */
  80.         if (!(dir->attr & 0x08))
  81.             continue;
  82.  
  83.         slot = entry;
  84.         strncpy((char *) vol, (char *) dir->name, 8);
  85.         vol[8] = '\0';
  86.         strncat((char *) vol, (char *) dir->ext, 3);
  87.         vol[11] = '\0';
  88.  
  89.         printf("Volume in drive %c is \"%s\"\n", drive, vol);
  90.         break;
  91.     }
  92.     if (slot < 0) {
  93.         fprintf(stderr, "%s: No directory slots\n", argv[0]);
  94.         exit(1);
  95.     }
  96.     if (vol[0] == '\0')
  97.         printf("Volume in drive %c is unlabeled\n", drive);
  98.  
  99.                     /* ask for new label */
  100.     printf("Enter the new volume label (11 characters): ");
  101.     gets(filename);
  102.     if (filename[0] != '\0') {
  103.         sprintf((char *) fixed, "%-11.11s", filename);
  104.         if (strlen(filename) > 11 && verbose)
  105.             printf("New label is \"%s\"\n", fixed);
  106.     }
  107.     else {
  108.         if (vol[0] == '\0')
  109.             exit(0);
  110.  
  111.         printf("Delete volume label (y/n): ");
  112.         gets(ans);
  113.         if (ans[0] == 'y' || ans[0] == 'Y') {
  114.             strcpy((char *) fixed, (char *) vol);
  115.             fixed[0] = 0xe5;
  116.         }
  117.         else
  118.             exit(0);
  119.     }
  120.                     /* make directory entry */
  121.     time(&now);
  122.     dir = mk_entry(fixed, 0x08, 0, 0L, now);
  123.     dir_write(slot, dir);
  124.  
  125.     dir_flush();
  126.     disk_flush();
  127.     close(fd);
  128.     exit(0);
  129. }
  130.